package com.hzqy.service.virtualchannel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.expression.spel.ast.Literal;

import com.hzqy.web.vo.virtualchannel.VirtualChannelVo;
import com.jhlabs.image.MarbleFilter;

public class VirtualChannelVoValidation {
	protected static final Logger LOG = LoggerFactory.getLogger(VirtualChannelVoValidation.class);

	public static final String validtimeb = "00:00:00";
	public static final String validtimee = "23:59:59";
	
	/**
	 * 验证用户提交的开播时间和停播时间是否有效
	 * @param userSaveVo
	 * @param list
	 * @return
	 */
	public static Map<String, String> validationValue(VirtualChannelVo userSaveVo,List<VirtualChannelVo> list){
		Map<String, String> finalresultMap = new HashMap<String, String>();
		if(userSaveVo.getF_vc_id()==0 || userSaveVo.getF_vc_type()==2){//说明是新增 或者是插播，插播的新增和修改用同一个验证方法
			if(userSaveVo.getF_vc_type()==2){//插播内容
				LOG.debug("插播节目修改,已有节目单列表.size():"+list.size());
				finalresultMap = updateValidation(list, userSaveVo);
			}else{
				//新增时的时间判断
				LOG.debug("非插播节目新增,已有节目单列表.size():"+list.size());
				finalresultMap = insertValidation(list,userSaveVo);
			}
		}else{
			LOG.debug("修改节目单信息");
			finalresultMap = updateValidation(list, userSaveVo);
		}//修改else 分支结束
		return finalresultMap;
	}
	
	
	/**
	 * 修改时做的验证
	 * @param list
	 * @param userSaveVo
	 * @return
	 */
	public static Map<String, String> updateValidation(List<VirtualChannelVo> list,VirtualChannelVo userSaveVo){
		Map<String, String> resultMap = new HashMap<String, String>();
		//修改的时候，前端已做过验证，开播时间一点要小于停播时间
		List<VirtualChannelVo> tmplist = new ArrayList<VirtualChannelVo>();
		for(int i=0;i<list.size();i++){
			VirtualChannelVo vo = list.get(i);
			if(vo.getF_vc_id() != userSaveVo.getF_vc_id()){
				tmplist.add(list.get(i));
			}
		}
		resultMap = insertValidation(tmplist, userSaveVo);
		return resultMap;
	}
	/**
	 * 新增验证用户输入的开始时间和停播时间，根据数据库中的节目单列表做比较
	 * @param list
	 * @param userSaveVo
	 * @return
	 */
	public static Map<String, String> insertValidation(List<VirtualChannelVo> list,VirtualChannelVo userSaveVo){
		Map<String, String> resultMap = new HashMap<String, String>();
		String flag = "true";
		String message = "可以正常插入";
		String airtime = userSaveVo.getF_vc_airTime();
		String offtime = userSaveVo.getF_vc_offAirTime();
		//新增时的时间判断
		for(int i=0;i<list.size();i++){
			VirtualChannelVo vo = list.get(i);
			String dbairtime = vo.getF_vc_airTime();//数据库中的开播时间
			String dbofftime = vo.getF_vc_offAirTime();//数据库中的停播时间
			//用户选择开始时间在 db开播时间 和 db 停播时间之间，时间点有重复，提示用户本时间段已有其他节目，请重新选择节目开播时间
			if(centerCompareTime(dbairtime, airtime, dbofftime)){
				flag = "false";
				message = "新增，本时间段已有其他节目，请重新选择节目开播时间,---用户选择开始时间在 db开播时间 和 db 停播时间之间";
				break;
			}
			//用户选择结束时间在 db开播时间 和 db 停播时间之间，时间点有重复，提示用户本时间段已有其他节目，请重新选择节目开播时间
			if(centerCompareTime(dbairtime, offtime, dbofftime)){
				flag = "false";
				message = "新增，本时间段已有其他节目，请重新选择节目开播时间,---用户选择结束时间在 db开播时间 和 db 停播时间之间";
				break;
			}
			//用户选择的开始时间 和 结束时间 包含了db开始时间，时间点有重复，提示用户本时间段已有其他节目，请重新选择节目开播时间
			if(centerCompareTime(airtime, dbairtime, offtime)){
				flag = "false";
				message = "新增，本时间段已有其他节目，请重新选择节目开播时间,---用户选择的开始时间 和 结束时间 包含了db开始时间";
				break;
			}
			//用户选择的开始时间 和 结束时间 包含了db结束时间，时间点有重复，提示用户本时间段已有其他节目，请重新选择节目开播时间
			if(centerCompareTime(airtime, dbofftime, offtime)){
				flag = "false";
				message = "新增，本时间段已有其他节目，请重新选择节目开播时间,---用户选择的开始时间 和 结束时间 包含了db结束时间";
				break;
			}
			//用户选择的开始时间和结束时间不在0点和24点之间，提示用户时间选择异常，请重新选择时间
			if(!centerCompareTime(validtimeb, airtime, validtimee) || !centerCompareTime(validtimeb, offtime, validtimee)){
				flag = "false";
				message = "新增，时间选择异常，请重新选择时间，只能选择0点和24点之间!";
				break;
			}
		}
		LOG.debug("message:"+message);
		resultMap.put("flag", flag);
		resultMap.put("message", message);
		return resultMap;
	}
	
	/**
	 * 如果 开始时间 < 要比较的时间 并且 要比较的时间 < 结束时间，说明要比较的时间在 开始时间 和 结束时间 之间
	 * @param tbegin 开始时间
	 * @param tcenter 要比较的时间
	 * @param tend 结束时间
	 * @return
	 */
	public static boolean centerCompareTime(String tbegin,String tcenter,String tend){
		boolean flag = false;
		String[] arybegin = tbegin.split(":");
		int totalbegin = Integer.valueOf(arybegin[0]) * 3600 + Integer.valueOf(arybegin[1]) * 60 + Integer.valueOf(arybegin[2]);
		String[] arycenter = tcenter.split(":");
		int totalcenter = Integer.valueOf(arycenter[0]) * 3600 + Integer.valueOf(arycenter[1]) * 60 + Integer.valueOf(arycenter[2]);
		String[] aryend = tend.split(":");
		int totalend = Integer.valueOf(aryend[0]) * 3600 + Integer.valueOf(aryend[1]) * 60 + Integer.valueOf(aryend[2]);
		if(totalbegin <= totalcenter && totalcenter <= totalend){
			flag = true;
		}
		return flag;
	}
	
	public static boolean compareTime(String s1,String s2){
		try {
			if (s1.indexOf(":") < 0 || s2.indexOf(":") < 0) {
				System.out.println("格式不正确");
			} else {
				String[] array1 = s1.split(":");
				int total1 = Integer.valueOf(array1[0]) * 3600 + Integer.valueOf(array1[1]) * 60 + Integer.valueOf(array1[2]);
				String[] array2 = s2.split(":");
				int total2 = Integer.valueOf(array2[0]) * 3600 + Integer.valueOf(array2[1]) * 60 + Integer.valueOf(array2[2]);
				return total1 - total2 > 0 ? true : false;
			}
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			return false;
		}
		return false;
	}
	
	/**
	 * 验证vo
	 * @param vo
	 * @return
	 */
	public static Map<String, String> checkValue(VirtualChannelVo vo){
		Map<String, String> resultMap = new HashMap<String, String>();
		if(!ValidateValue.validateByRegex(vo.getF_vc_airTime(), ValidateValue.TIMEREGEX)){
			resultMap.put("message", "开播时间格式不正确,请检查!");
			resultMap.put("flag", "-1");
			return resultMap;
		}else if(!ValidateValue.validateByRegex(vo.getF_vc_offAirTime(), ValidateValue.TIMEREGEX)){
			resultMap.put("message", "停播时间格式不正确,请检查!");
			resultMap.put("flag", "-1");
			return resultMap;
		}
		
		
		resultMap.put("message", "验证通过");
		resultMap.put("flag", "1");
		return resultMap;
	}
	
	
}
